const { Transform } = require('stream');
const _ = require('lodash');
const utils = require('../../utils');


module.exports = function (groupKey, options) {
  const stream = new Transform({ objectMode: true });
  const group = {};
  stream._transform = async function (chunk, encoding, callback) {
    const mainValue = chunk[groupKey];
    const keys = _.keys(chunk);
    if (!group[mainValue]) {
      group[mainValue] = {};
      for (const key of keys) {
        if (options[key] == 1 || options[key] == -1) { // 取第一个 或 最后一个
          group[mainValue][key] = chunk[key];
        } else if ((options[key] === '1+' || options[key] === '-1+') && chunk[key]) { // 取第一个非空
          group[mainValue][key] = chunk[key];
        } else if (options[key] === '+') { // 取和
          group[mainValue][key] = +chunk[key];
        } else if (options[key] === '*') { // 取乘积
          group[mainValue][key] = +chunk[key];
        } else if (options[key] === '/') { // 取平均
          group[mainValue][key] = { s: +chunk[key], n: 1, t: '/' };
        } else if (options[key] === '_') { // 取方根
          group[mainValue][key] = { s: +chunk[key], n: 1, t: '_' };
        } else if (options[key] === 'm') { // 取中位数
          group[mainValue][key] = { l: [chunk[key]], n: 1, t: 'l' };
        } else if (options[key] === 'l') { // 取数组
          group[mainValue][key] = [chunk[key]];
        }
      }
    } else {
      for (const key of keys) {
        if (options[key] == -1) { // 取最后一个
          group[mainValue][key] = chunk[key];
        } else if (options[key] === '-1+' && chunk[key]) { // 取第一个非空
          group[mainValue][key] = chunk[key];
        } else if (options[key] === '+') { // 取和
          group[mainValue][key] += +chunk[key];
        } else if (options[key] === '*') { // 取乘积
          group[mainValue][key] *= +chunk[key];
        } else if (options[key] === '/') { // 取平均
          group[mainValue][key].s += +chunk[key];
          group[mainValue][key].n++;
        } else if (options[key] === '_') { // 取方根
          group[mainValue][key].s *= +chunk[key];
          group[mainValue][key].n++;
        } else if (options[key] === 'm') { // 取中位数
          const n = group[mainValue][key].n + 1;
          group[mainValue][key].n = n;
          group[mainValue][key].l.push(chunk[key]);
          (n & 1) && group[mainValue][key].l.splice(0, 1);
        } else if (options[key] === 'l') { // 取数组
          group[mainValue][key].push(chunk[key]);
        }
      }
    }
    callback();
  };
  stream._flush = function (callback) {
    _.values(group).forEach(o => {
      _.forEach(o, (m, k) => m && m.t && (o[k] = m.t === '/' ? m.s / m.n : m.t === '_' ? Math.pow(m.s, 1 / m.n) : m.l[0]))
      stream.push(o)
    });
    callback();
  };
  stream.on('finish', function () {
    utils.debug('groupTransform [finish]');
  });

  return stream;
};